package com.hqd.ch03.v51.boot.web.context;

import com.hqd.ch03.v51.boot.web.server.WebServer;
import com.hqd.ch03.v51.context.SmartLifecycle;

public final class WebServerGracefulShutdownLifecycle implements SmartLifecycle {

    /**
     * {@link SmartLifecycle#getPhase() SmartLifecycle phase} in which graceful shutdown
     * of the web server is performed.
     */
    public static final int SMART_LIFECYCLE_PHASE = SmartLifecycle.DEFAULT_PHASE;

    private final WebServer webServer;

    private volatile boolean running;

    /**
     * Creates a new {@code WebServerGracefulShutdownLifecycle} that will gracefully shut
     * down the given {@code webServer}.
     *
     * @param webServer web server to shut down gracefully
     */
    public WebServerGracefulShutdownLifecycle(WebServer webServer) {
        this.webServer = webServer;
    }

    @Override
    public void start() {
        this.running = true;
    }

    @Override
    public void stop() {
        throw new UnsupportedOperationException("Stop must not be invoked directly");
    }

    @Override
    public void stop(Runnable callback) {
        this.running = false;
        this.webServer.shutDownGracefully((result) -> callback.run());
    }

    @Override
    public boolean isRunning() {
        return this.running;
    }

    @Override
    public int getPhase() {
        return SMART_LIFECYCLE_PHASE;
    }

}
